﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CPPaquetes.DataAccessComponents;
using CPPaquetes.BusinessEntities;
using System.Configuration;

namespace CPPaquetes.BusinessLayer
{
    public class Programa
    {
        CPPaquetesModel _context = new CPPaquetesModel();

        public ProgramaInfo GetProgramaInfoById(int? PROGRAMA_ID)
        {
            ProgramaInfo programaInfo = new ProgramaInfo();
            HospedajeInfo hospedajeInfo = new HospedajeInfo();
            
            string hospedajeNombre = "";
            int cant = 0;
            int TipoCambio = 1;

            
            string urlBase = ConfigurationManager.AppSettings["UrlImagenes"];


            try
            {
                programaInfo.PROGRAMA = _context.TBL_PROGRAMA.FirstOrDefault(x => x.PROGRAMA_ID == PROGRAMA_ID);
                if (programaInfo.PROGRAMA == null)
                    return null;

                if (programaInfo.PROGRAMA.NOTAS_CONFIGURACION != null)
                {
                    programaInfo.NOTAS_CONFIGURACION = programaInfo.PROGRAMA.NOTAS_CONFIGURACION.Replace("\r\n", "\r").Split('\r');
                }
                else
                {
                    programaInfo.NOTAS_CONFIGURACION = new string[] { };
                }


                // si debe usar tipo de cambio
                if (programaInfo.PROGRAMA.DESTINO_PROGRAMA == "I")
                {
                    TipoCambio = Convert.ToInt32(programaInfo.PROGRAMA.VALOR_TIPO_CAMBIO);
                }
                programaInfo.INCLUYE = _context.TBL_PROGRAMA_INCLUYE.Where(x => x.PROGRAMA_ID == PROGRAMA_ID).OrderBy(x => x.ORDEN_WEB).ToList();
                programaInfo.IMAGEN = _context.TBL_IMAGENES_PROGRAMA.Where(x => x.PROGRAMA_ID == PROGRAMA_ID).First();

                if (programaInfo.IMAGEN.IMAGEN_CABECERA != null)
                {
                    programaInfo.IMAGEN.IMAGEN_CABECERA = urlBase + programaInfo.IMAGEN.IMAGEN_CABECERA.Trim();
                }

                #region Notas
                List<TBL_PROGRAMA_NOTA> programa_notas = _context.TBL_PROGRAMA_NOTA.Include("TBL_NOTA").Where(x => x.PROGRAMA_ID == PROGRAMA_ID).OrderBy(x => x.ORDEN_WEB).ToList();

                programaInfo.NOTAS = new List<ProgramaInfoNota>();

                foreach (TBL_PROGRAMA_NOTA pn in programa_notas)
                {
                    if (pn.NOTA_ID == null)
                    {
                        programaInfo.NOTAS.Add(new ProgramaInfoNota() { GLOSA = pn.GLOSA, DESTACADO = pn.DESTACADO == "SI" });
                    }
                    else
                    {
                        //Se agrega esta validación ya que los programas están cargados con URL's relativas
                        if (pn.TBL_NOTA.GLOSA.Contains("../../../../../"))
                            pn.TBL_NOTA.GLOSA = pn.TBL_NOTA.GLOSA.Replace("../../../../../", "http://www.viajesfalabella.cl/");

                        programaInfo.NOTAS.Add(new ProgramaInfoNota() { GLOSA = pn.TBL_NOTA.GLOSA, DESTACADO = pn.DESTACADO == "SI" });

                    }
                }

                #endregion

                programaInfo.TIENE_LINK_ITINERARIO = (_context.TBL_PROGRAMA_ITINERARIO_GLOSA.Where(o => o.PROGRAMA_ID == PROGRAMA_ID).Count() > 0);

                #region  Carga los hospedajes
                // Busca los hospedajes
                List<prc_ver_hospedaje_por_programa_id_Result> hospedajes = _context.prc_ver_hospedaje_por_programa_id(PROGRAMA_ID).ToList();

                if (hospedajes.Count > 0)
                {
                    #region Hospedaje Normal

                    programaInfo.TIENE_HOSPEDAJE_HTML = false;

                    // Busca las vigencias de los hospedajes
                    List<prc_ver_vigencia_hospedaje_por_programa_id_Result> vigencias = _context.prc_ver_vigencia_hospedaje_por_programa_id(PROGRAMA_ID).ToList();

                    List<TBL_PROGRAMA_GLOSA_HABITACION> glosaHab = _context.TBL_PROGRAMA_GLOSA_HABITACION.Where(x => x.PROGRAMA_ID == PROGRAMA_ID).OrderBy(x => x.POSICION_HABITACION).ToList();

                    programaInfo.HOSPEDAJE_COLS = new HospedajeInfoColumna();


                    #region Carga titulos de las columnas
                    foreach (TBL_PROGRAMA_GLOSA_HABITACION pg in glosaHab)
                    {
                        switch (pg.POSICION_HABITACION)
                        {
                            case 1:
                                programaInfo.HOSPEDAJE_COLS.titulo1 = pg.GLOSA;
                                break;
                            case 2:
                                programaInfo.HOSPEDAJE_COLS.titulo2 = pg.GLOSA;
                                break;
                            case 3:
                                programaInfo.HOSPEDAJE_COLS.titulo3 = pg.GLOSA;
                                break;
                            case 4:
                                programaInfo.HOSPEDAJE_COLS.titulo4 = pg.GLOSA;
                                break;
                            case 5:
                                programaInfo.HOSPEDAJE_COLS.titulo5 = pg.GLOSA;
                                break;
                            case 6:
                                programaInfo.HOSPEDAJE_COLS.titulo6 = pg.GLOSA;
                                break;
                            case 99:
                                programaInfo.HOSPEDAJE_COLS.titulo7 = pg.GLOSA;
                                break;

                        }
                    }
                    #endregion


                    programaInfo.HOSPEDAJE = new List<HospedajeInfo>();
                    foreach (prc_ver_hospedaje_por_programa_id_Result hosp in hospedajes)
                    {
                        
                        foreach (prc_ver_vigencia_hospedaje_por_programa_id_Result vig in vigencias)
                        {
                            // busca la vigencia para este hospedaje
                            if (vig.hospedaje_id == hosp.hospedaje_id)
                            {
                                TBL_HOSPEDAJE hospedajeData = _context.TBL_HOSPEDAJE.Where(o => o.HOSPEDAJE_ID == hosp.hospedaje_id).SingleOrDefault();

                                hospedajeInfo = new HospedajeInfo();

                                hospedajeInfo.Nombre = hosp.nombre_hospedaje;

                                if (hospedajeData != null)
                                {
                                    hospedajeInfo.Categoria = hospedajeData.CATEGORIA.ToString();
                                    hospedajeInfo.Atributo_Categoria = hospedajeData.ATRIBUTO_CATEGORIA;
                                }


                                hospedajeInfo.HotelShow = true;
                                hospedajeInfo.HotelSpan = 0;
                                hospedajeInfo.Vigencia = vig.fecha_vigencia_desde + " al " + vig.fecha_vigencia_hasta;
                                hospedajeInfo.valor_single = Convert.ToInt32(vig.valor_single);// *TipoCambio;
                                hospedajeInfo.valor_doble = Convert.ToInt32(vig.valor_doble);// * TipoCambio;
                                hospedajeInfo.valor_triple = Convert.ToInt32(vig.valor_triple);// * TipoCambio;
                                hospedajeInfo.valor_cuadruple = Convert.ToInt32(vig.valor_cuadruple);// * TipoCambio;
                                hospedajeInfo.valor_quintuple = Convert.ToInt32(vig.valor_quintuple);// * TipoCambio;
                                hospedajeInfo.valor_sextuple = Convert.ToInt32(vig.valor_sextuple);// * TipoCambio;
                                hospedajeInfo.valor_ninyos = Convert.ToInt32(vig.valor_ninyos);// * TipoCambio;

                                if (hospedajeInfo.valor_single > 0)
                                    programaInfo.HOSPEDAJE_COLS.show_valor_single = true;
                                if (hospedajeInfo.valor_doble > 0)
                                    programaInfo.HOSPEDAJE_COLS.show_valor_doble = true;
                                if (hospedajeInfo.valor_triple > 0)
                                    programaInfo.HOSPEDAJE_COLS.show_valor_triple = true;
                                if (hospedajeInfo.valor_cuadruple > 0)
                                    programaInfo.HOSPEDAJE_COLS.show_valor_cuadruple = true;
                                if (hospedajeInfo.valor_quintuple > 0)
                                    programaInfo.HOSPEDAJE_COLS.show_valor_quintuple = true;
                                if (hospedajeInfo.valor_sextuple > 0)
                                    programaInfo.HOSPEDAJE_COLS.show_valor_sextuple = true;
                                if (hospedajeInfo.valor_ninyos > 0)
                                    programaInfo.HOSPEDAJE_COLS.show_valor_ninyos = true;

                                programaInfo.HOSPEDAJE.Add(hospedajeInfo);
                            }
                        }
                    }
                    // Revisa si es necesario hacer SPAN
                    hospedajeInfo = null;
                    //HOSPEDAJE_COLS
                    foreach (HospedajeInfo hi in programaInfo.HOSPEDAJE)
                    {
                        if (hi.Nombre != hospedajeNombre)
                        {
                            if (hospedajeInfo != null)
                            {
                                hospedajeInfo.HotelSpan = cant;
                            }
                            cant = 0;
                            hospedajeInfo = hi;
                            hospedajeNombre = hi.Nombre;
                        }
                        else
                        {
                            hi.HotelShow = false;
                        }
                        cant++;
                    }
                    if (cant > 0 && hospedajeInfo != null)
                    {
                        hospedajeInfo.HotelSpan = cant;
                    }

                    #endregion

                    #region Hospedaje Adicional
                    
                    programaInfo.HOSPEDAJE_ADICIONAL = new List<HospedajeInfo>();

                    foreach (prc_ver_hospedaje_por_programa_id_Result hosp in hospedajes)
                    {
                        if (hosp.noches_adicionales == "SI")
                        {
                            foreach (prc_ver_vigencia_hospedaje_por_programa_id_Result vig in vigencias)
                            {
                                // busca la vigencia para este hospedaje
                                if (vig.hospedaje_id == hosp.hospedaje_id)
                                {

                                    TBL_HOSPEDAJE hospedajeData = _context.TBL_HOSPEDAJE.Where(o => o.HOSPEDAJE_ID == hosp.hospedaje_id).SingleOrDefault();

                                    hospedajeInfo = new HospedajeInfo();

                                    hospedajeInfo.Nombre = hosp.nombre_hospedaje;

                                    if (hospedajeData != null)
                                    {
                                        hospedajeInfo.Categoria = hospedajeData.CATEGORIA.ToString();
                                        hospedajeInfo.Atributo_Categoria = hospedajeData.ATRIBUTO_CATEGORIA;
                                    }

                                    hospedajeInfo.Nombre = hosp.nombre_hospedaje;
                                    hospedajeInfo.HotelShow = true;
                                    hospedajeInfo.HotelSpan = 0;
                                    hospedajeInfo.Vigencia = vig.fecha_vigencia_desde + " al " + vig.fecha_vigencia_hasta;
                                    hospedajeInfo.valor_single = Convert.ToInt32(vig.valor_single_na);// *TipoCambio;
                                    hospedajeInfo.valor_doble = Convert.ToInt32(vig.valor_doble_na);// * TipoCambio;
                                    hospedajeInfo.valor_triple = Convert.ToInt32(vig.valor_triple_na);// * TipoCambio;
                                    hospedajeInfo.valor_cuadruple = Convert.ToInt32(vig.valor_cuadruple_na);// * TipoCambio;
                                    hospedajeInfo.valor_quintuple = Convert.ToInt32(vig.valor_quintuple_na);// * TipoCambio;
                                    hospedajeInfo.valor_sextuple = Convert.ToInt32(vig.valor_sextuple_na);// * TipoCambio;
                                    hospedajeInfo.valor_ninyos = Convert.ToInt32(vig.valor_ninyos_na);// * TipoCambio;

                                    if (hospedajeInfo.valor_single > 0)
                                        programaInfo.HOSPEDAJE_COLS.show_valor_single = true;
                                    if (hospedajeInfo.valor_doble > 0)
                                        programaInfo.HOSPEDAJE_COLS.show_valor_doble = true;
                                    if (hospedajeInfo.valor_triple > 0)
                                        programaInfo.HOSPEDAJE_COLS.show_valor_triple = true;
                                    if (hospedajeInfo.valor_cuadruple > 0)
                                        programaInfo.HOSPEDAJE_COLS.show_valor_cuadruple = true;
                                    if (hospedajeInfo.valor_quintuple > 0)
                                        programaInfo.HOSPEDAJE_COLS.show_valor_quintuple = true;
                                    if (hospedajeInfo.valor_sextuple > 0)
                                        programaInfo.HOSPEDAJE_COLS.show_valor_sextuple = true;
                                    if (hospedajeInfo.valor_ninyos > 0)
                                        programaInfo.HOSPEDAJE_COLS.show_valor_ninyos = true;

                                    programaInfo.HOSPEDAJE_ADICIONAL.Add(hospedajeInfo);
                                }
                            }
                        }
                    }
                    // Revisa si es necesario hacer SPAN
                    hospedajeInfo = null;
                    //HOSPEDAJE_COLS
                    foreach (HospedajeInfo hi in programaInfo.HOSPEDAJE_ADICIONAL)
                    {
                        if (hi.Nombre != hospedajeNombre)
                        {
                            if (hospedajeInfo != null)
                            {
                                hospedajeInfo.HotelSpan = cant;
                            }
                            cant = 0;
                            hospedajeInfo = hi;
                            hospedajeNombre = hi.Nombre;
                        }
                        else
                        {
                            hi.HotelShow = false;
                        }
                        cant++;
                    }
                    if (cant > 0 && hospedajeInfo != null)
                    {
                        hospedajeInfo.HotelSpan = cant;
                    }

                    #endregion
                }
                else
                {
                    #region Hospedaje HTML
                    programaInfo.TIENE_HOSPEDAJE_HTML = true;
                    List<TBL_HOSPEDAJE_HTML> hospedajeHTMLlList;

                    hospedajeHTMLlList = _context.TBL_HOSPEDAJE_HTML.Where(x => x.PROGRAMA_ID == PROGRAMA_ID).ToList<TBL_HOSPEDAJE_HTML>();

                    foreach (TBL_HOSPEDAJE_HTML hospedajeHTML in hospedajeHTMLlList)
                    {
                        programaInfo.HOSPEDAJE_HTML = hospedajeHTML.HOSPEDAJE_HTML + "<BR/>";
                    }

                    #endregion
                }
                #endregion

                programaInfo.TIENE_AEREO = false;
                if (programaInfo.PROGRAMA.INCLUYE_LINEA_AEREA == "SI")
                {
                    programaInfo.TIENE_AEREO = true;
                }

                TBL_CUADRO_VARIABLE cuadro_variable = null;
                
                cuadro_variable = _context.TBL_CUADRO_VARIABLE.Include("TBL_DETALLE_CUADRO_VARIABLE").Where(x => x.PROGRAMA_ID == PROGRAMA_ID).FirstOrDefault();
                
                programaInfo.TIENE_CUADRO_VARIABLE = false; 
                if (cuadro_variable != null)
                {
                    programaInfo.TIENE_CUADRO_VARIABLE = true;
                    programaInfo.CUADRO_VARIABLE = cuadro_variable;
                }

                return programaInfo;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
